﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Ponei
{
    class GameObject
    {
        protected GameWindow window;
        protected Texture2D imagem;
        protected Vector2 posicao;
        public Vector2 Posicao
        {
            get
            {
                return posicao;
            }
            set
            {
                posicao = value;
            }
        }
        protected Vector2 velocidade;
        protected Rectangle origem;
        protected Rectangle destino;
        protected float rotacao;
        protected Vector2 pivo;
        protected bool direita;

        protected float escala;

        public bool visivel;

        public static List<GameObject> listaGameObjects = new List<GameObject>();

        protected float camada;
        protected float alfa;
        protected Color cor;
        protected Rectangle colisao;
        public Rectangle Colisao
        {
            get
            {
                return colisao;
            }
            set
            {
                colisao = value;
            }
        }

        public struct animacao
        {
            public int quadro_X;
            public int quadro_Y;
            public int qtd_quadros;
            public int quadro_atual;
            public int quadros_seg;
            public int Y;
            public string nome;
            public bool ativa;

        }

        public GameObject(Texture2D imagem, GameWindow Window)
        {
            this.imagem = imagem;
            this.window = Window;
            this.visivel = true;
            this.alfa = 1;
            this.escala = 1f;
            
            listaGameObjects.Add(this);
        }

     


        public void Draw(GameTime gameTime, SpriteBatch spriteBatch, animacao _animacao)
        {

            if (visivel)
            {
                int frame;

                if (_animacao.ativa)
                {
                    frame = (int)(gameTime.TotalGameTime.TotalSeconds * _animacao.quadros_seg) % _animacao.qtd_quadros;
                }
                else
                {
                    frame = 0;
                }

                spriteBatch.Draw(imagem, 
                    posicao, 
                    new Rectangle(
                            frame * _animacao.quadro_X,
                            (_animacao.Y * _animacao.quadro_Y),
                            _animacao.quadro_X,
                            _animacao.quadro_Y),
                            Color.White,
                            rotacao,
                            pivo,
                            escala,
                            (direita) ? SpriteEffects.None : SpriteEffects.FlipHorizontally,
                            camada);


                
                /*spriteBatch.Draw(
                        imagem,
                        new Rectangle(
                            (int)posicao.X,
                            (int)posicao.Y,
                            _animacao.quadro_X,
                            _animacao.quadro_Y),
                        new Rectangle(
                            frame * _animacao.quadro_X,
                            _animacao.Y,
                            _animacao.quadro_X,
                            _animacao.quadro_Y),
                        new Color(
                            1.0f * alfa,
                            1.0f * alfa,
                            1.0f * alfa,
                            alfa),
                        rotacao,
                        pivo,
                        (direita) ? SpriteEffects.None : SpriteEffects.FlipHorizontally,
                        camada);
                 */
                 
            }
        }

        public Boolean isValidPosition()
        {
            if ((this.posicao.X >= (window.ClientBounds.Width - 380)) || (this.posicao.X <= 0))
            {
                //Console.WriteLine("Width");
                return false;
            }

            if ((this.posicao.Y >= window.ClientBounds.Height - 550) || (this.posicao.Y <= 0-300))
            {
                //Console.WriteLine("Height");
                return false;
            }
                

            foreach(GameObject gameObject in listaGameObjects)
            {
                if (gameObject.colisao.Intersects(this.colisao))
                {
                    return false;
                }
            }

            return true;
        }

        public void doMove(int dir)
        {
            switch (dir)
            {
                case 0: // Cima
                    {
                        this.posicao = new Vector2(this.posicao.X, this.posicao.Y - 2f);
                        break;
                    }
                case 1: // Direita
                    {
                        this.posicao = new Vector2(this.posicao.X + 2f, this.posicao.Y);
                        break;
                    }
                case 2: // Baixo
                    {
                        this.posicao = new Vector2(this.posicao.X, this.posicao.Y + 2f);
                        break;
                    }
                case 3: // Esquerda
                    {
                        this.posicao = new Vector2(this.posicao.X - 2f, this.posicao.Y);
                        break;
                    }
            }
        }

        public void doMove(int dir, float change)
        {
            Vector2 old_position = posicao;

            switch (dir)
            {
                case 0: // Cima
                case 2: // Baixo
                    {
                        this.posicao = new Vector2(this.posicao.X, this.posicao.Y + change);
                        break;
                    }
                case 1: // Direita
                case 3: // Esquerda
                    {
                        this.posicao = new Vector2(this.posicao.X + change, this.posicao.Y);
                        break;
                    }
            }

            if (!isValidPosition())
            {
                //Console.WriteLine("not valid!");
                this.posicao = old_position;
            }
        }

    }
}





